public class IsPalindrome {
    /**
     * 判断一个字符串是否是回文字符串：
     * 如果将所有的大写字符转化为小写字符，并移除所有的非字母数字字符之后。
     * 短语正着读反着读都一样，则认为该短语是回文字符串
     * 如果是回文字符串，最后返回true
     * 如果不是最后返回false
     *
     * @param s
     * @return
     */

    public static boolean isPalindrome(String s) {
        //将字符串转化为小写
        String tmp = s.toLowerCase();
        //需要判断字符是否是字母或者数字
        //利用快速排序的划分思想，利用双指针法，从不同的方向遍历字符串
        int left = 0;
        int right = tmp.length() - 1;

        while (left < right) {

            //从前往后进行遍历，如果遇到非字母数字则跳过
            while (left < right && !isDigitOrNumber(tmp.charAt(left))) {
                left++;
            }

            //从后往前遍历，如果遇到非字母数字则跳过
            while (left < right && !isDigitOrNumber(tmp.charAt(right))) {
                right--;
            }

            if (tmp.charAt(left) == tmp.charAt(right)) {
                left++;
                right--;
            } else {
                return false;
            }
        }

        return true;
    }

    public static boolean isPalindrome1(String s) {
        //将字符串转化为小写
        String tmp = s.toLowerCase();

        //利用StringBuffer反转字符串，然后和原字符串比较
        char[] chars = tmp.toCharArray();

        StringBuffer stringBuffer = new StringBuffer();

        for (int i = 0; i < chars.length; i++) {
           if(isDigitOrNumber(chars[i])) {
               stringBuffer.append(chars[i]);
           }
        }

        //将StringBuffer转化为String
        String before = stringBuffer.toString();
        //反转
        String after = stringBuffer.reverse().toString();

        return before.equals(after);
    }

    public static boolean isDigitOrNumber(char c) {
        if (Character.isDigit(c) || Character.isLetter(c)) {
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
        boolean result = isPalindrome(" ");
        System.out.println(result);
    }


}
